import re
import hashlib
import json
import os
from datetime import datetime

class UserManager:
    def __init__(self):
        # 用户数据文件所在目录
        self.data_dir = os.path.join(os.getcwd(), "data")
        # 用户数据文件路径
        self.user_data_file = os.path.join(self.data_dir, "users.json")
        # 初始化用户数据文件
        self.initialize_user_data()

    def initialize_user_data(self):
        """
        初始化用户数据文件
        """
        # 确保数据目录存在，不存在就创建
        os.makedirs(self.data_dir, exist_ok=True)
        if not os.path.exists(self.user_data_file):
            # 如果用户数据文件不存在，创建一个空的 JSON 文件
            with open(self.user_data_file, 'w') as f:
                json.dump({}, f)

    def validate_username(self, username):
        """
        验证用户名是否有效
        :param username: 用户名
        :return: 验证结果和错误信息
        """
        if not username:
            return False, "用户名不能为空"
        if len(username) < 3 or len(username) > 20:
            return False, "用户名长度必须在3-20个字符之间"
        if not re.match(r'^[a-zA-Z0-9_]+$', username):
            return False, "用户名只能包含字母、数字和下划线"
        return True, ""

    def validate_password(self, password):
        """
        验证密码是否有效
        :param password: 密码
        :return: 验证结果和错误信息
        """
        if not password:
            return False, "密码不能为空"
        if len(password) < 6 or len(password) > 20:
            return False, "密码长度必须在6-20个字符之间"
        return True, ""

    def validate_email(self, email):
        """
        验证邮箱是否有效
        :param email: 邮箱地址
        :return: 验证结果和错误信息
        """
        if not email:
            return False, "邮箱不能为空"
        if not re.match(r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$', email):
            return False, "邮箱格式不正确"
        return True, ""

    def hash_password(self, password):
        """
        对密码进行哈希处理
        :param password: 明文密码
        :return: 哈希后的密码
        """
        return hashlib.sha256(password.encode('utf-8')).hexdigest()

    def register(self, username, password, confirm_password, email):
        """
        处理用户注册
        :param username: 用户名
        :param password: 密码
        :param confirm_password: 确认密码
        :param email: 邮箱地址
        :return: 注册结果和提示信息
        """
        # 验证用户名
        valid, message = self.validate_username(username)
        if not valid:
            return False, message
        # 验证密码
        valid, message = self.validate_password(password)
        if not valid:
            return False, message
        # 检查密码是否匹配
        if password != confirm_password:
            return False, "两次输入的密码不一致"
        # 验证邮箱
        valid, message = self.validate_email(email)
        if not valid:
            return False, message
        try:
            # 读取用户数据文件
            with open(self.user_data_file, 'r') as f:
                users = json.load(f)
        except FileNotFoundError:
            users = {}
        except json.JSONDecodeError:
            return False, "用户数据文件格式错误，请联系管理员"
        # 检查用户名是否已存在
        if username in users:
            return False, "用户名已存在"
        # 对密码进行哈希处理
        hashed_password = self.hash_password(password)
        # 保存用户信息
        users[username] = {
            'password': hashed_password,
            'email': email,
            'register_time': datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
            'login_times': 0
        }
        try:
            # 将更新后的用户信息写入文件
            with open(self.user_data_file, 'w') as f:
                json.dump(users, f, indent=4)
        except IOError:
            return False, "保存用户数据时出错，请联系管理员"
        return True, "恭喜，注册成功！您现在可以登录了。"

    def login(self, username, password):
        """
        处理用户登录
        :param username: 用户名
        :param password: 密码
        :return: 登录结果和提示信息
        """
        if not username or not password:
            return False, "用户名和密码不能为空"
        try:
            # 读取用户数据文件
            with open(self.user_data_file, 'r') as f:
                users = json.load(f)
        except FileNotFoundError:
            return False, "用户数据文件不存在，请先注册"
        except json.JSONDecodeError:
            return False, "用户数据文件格式错误，请联系管理员"
        # 检查用户名是否存在
        if username not in users:
            return False, "用户名不存在"
        # 获取存储的哈希密码
        stored_password = users[username]['password']
        # 检查密码是否匹配
        if self.hash_password(password) != stored_password:
            return False, "密码错误"
        # 更新登录次数和最后登录时间
        users[username]['login_times'] += 1
        users[username]['last_login'] = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        try:
            # 将更新后的用户信息写入文件
            with open(self.user_data_file, 'w') as f:
                json.dump(users, f, indent=4)
        except IOError:
            return False, "保存用户数据时出错，请联系管理员"
        return True, f"欢迎回来，{username}！"